package top.lcm889.juc.demo;

/**
 * @author Coder-lcm
 * @date 2021/4/10
 *       yield方法是一个和slep方法有点相似的方法,它也是一个Thread类提供的一个静态方法,它
 * 也可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是将该线程转入就绪状态。 yield只是
 * 让当前线程暂停一下,让系统的线程调度器重新调度一次,完全可能的情况是:当某个线程调用了 yield
 * 方法暂停之后,线程调度器又将其调度出来重新执行
 *     实际上,当某个线程调用了 yield方法暂停之后,只有优先级与当前线程相同,或者优先级比当前
 * 线程更高的就绪状态的线程才会获得执行的机会。下面程序使用 yield来让当前正在执行的线程暂停:
 */
public class TestYield extends Thread{
    public TestYield() {

    }

    public TestYield(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
            System.out.println(getName() + " : " + i );
            // 当i == 20时，使用yield方法让当前线程让步
            if (i == 20) {
                // yield()只会给优先级相同、或者更高的线程执行机会，优先级低于其的不给让步机会
                Thread.yield();
            }
        }
    }

    public static void main(String[] args) {
        TestYield ty1 = new TestYield("Thread-A| 高级");
        // 将ty1线程设置为最高优先级
        ty1.setPriority(Thread.MAX_PRIORITY);
        ty1.start();

        TestYield ty2 = new TestYield("Thread-B| 低级");
        // 将ty2线程设置为最低优先级
        ty2.setPriority(Thread.MIN_PRIORITY);
        ty2.start();
    }
}

